home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / superopt.zip / GOAL.DEF < prev    next >
Text File  |  1992-11-28  |  13KB  |  212 lines

  1. /* This file contains the definitions and documentation for the goal functions
  2.    used in the Superoptimizer.
  3.  
  4.    Copyright (C) 1992 Free Software Foundation, Inc.
  5.  
  6.    This program is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by the
  8.    Free Software Foundation; either version 2, or (at your option) any
  9.    later version.
  10.  
  11.    This program is distributed in the hope that it will be useful, but
  12.    WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.    General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License along
  17.    with this program; see the file COPYING.  If not, write to the Free
  18.    Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /* The fields in the cpp macro call "DEF_GOAL()" are:
  21.  
  22.    1. The internal name of the goal function.
  23.  
  24.    2. The number of input operands.
  25.  
  26.    3. The printed name of the instruction.
  27.  
  28.    4. C code that implements the function.
  29.  
  30.    */
  31.  
  32. DEF_GOAL (EQ,             2, "eq",          { r = v0 == v1; })
  33. DEF_GOAL (NE,             2, "ne",          { r = v0 != v1; })
  34. DEF_GOAL (LES,            2, "les",         { r = (signed_word) v0 <= (signed_word) v1; })
  35. DEF_GOAL (GES,            2, "ges",         { r = (signed_word) v0 >= (signed_word) v1; })
  36. DEF_GOAL (LTS,            2, "lts",         { r = (signed_word) v0 < (signed_word) v1; })
  37. DEF_GOAL (GTS,            2, "gts",         { r = (signed_word) v0 > (signed_word) v1; })
  38. DEF_GOAL (LEU,            2, "leu",         { r = (unsigned_word) v0 <= (unsigned_word) v1; })
  39. DEF_GOAL (GEU,            2, "geu",         { r = (unsigned_word) v0 >= (unsigned_word) v1; })
  40. DEF_GOAL (LTU,            2, "ltu",         { r = (unsigned_word) v0 < (unsigned_word) v1; })
  41. DEF_GOAL (GTU,            2, "gtu",         { r = (unsigned_word) v0 > (unsigned_word) v1; })
  42. DEF_GOAL (LESU,           2, "lesu",        { r = (signed_word) v0 < 0 || (unsigned_word) v0 <= (unsigned_word) v1; })
  43. DEF_GOAL (GESU,           2, "gesu",        { r = (signed_word) v0 >= 0 && (unsigned_word) v0 >= (unsigned_word) v1; })
  44. DEF_GOAL (LTSU,           2, "ltsu",        { r = (signed_word) v0 < 0 || (unsigned_word) v0 < (unsigned_word) v1; })
  45. DEF_GOAL (GTSU,           2, "gtsu",        { r = (signed_word) v0 >= 0 && (unsigned_word) v0 > (unsigned_word) v1; })
  46.  
  47. DEF_GOAL (EQ0,            1, "eq0",         { r = v0 == 0; })
  48. DEF_GOAL (NE0,            1, "ne0",         { r = v0 != 0; })
  49. DEF_GOAL (LES0,           1, "les0",        { r = (signed_word) v0 <= 0; })
  50. DEF_GOAL (GES0,           1, "ges0",        { r = (signed_word) v0 >= 0; })
  51. DEF_GOAL (LTS0,           1, "lts0",        { r = (signed_word) v0 < 0; })
  52. DEF_GOAL (GTS0,           1, "gts0",        { r = (signed_word) v0 > 0; })
  53.  
  54. DEF_GOAL (NEQ,            2, "neq",         { r = -(v0 == v1); })
  55. DEF_GOAL (NNE,            2, "nne",         { r = -(v0 != v1); })
  56. DEF_GOAL (NLES,           2, "nles",        { r = -((signed_word) v0 <= (signed_word) v1); })
  57. DEF_GOAL (NGES,           2, "nges",        { r = -((signed_word) v0 >= (signed_word) v1); })
  58. DEF_GOAL (NLTS,           2, "nlts",        { r = -((signed_word) v0 < (signed_word) v1); })
  59. DEF_GOAL (NGTS,           2, "ngts",        { r = -((signed_word) v0 > (signed_word) v1); })
  60. DEF_GOAL (NLEU,           2, "nleu",        { r = -((unsigned_word) v0 <= (unsigned_word) v1); })
  61. DEF_GOAL (NGEU,           2, "ngeu",        { r = -((unsigned_word) v0 >= (unsigned_word) v1); })
  62. DEF_GOAL (NLTU,           2, "nltu",        { r = -((unsigned_word) v0 < (unsigned_word) v1); })
  63. DEF_GOAL (NGTU,           2, "ngtu",        { r = -((unsigned_word) v0 > (unsigned_word) v1); })
  64.  
  65. DEF_GOAL (NEQ0,           1, "neq0",        { r = -(v0 == 0); })
  66. DEF_GOAL (NNE0,           1, "nne0",        { r = -(v0 != 0); })
  67. DEF_GOAL (NLES0,          1, "nles0",       { r = -((signed_word) v0 <= 0); })
  68. DEF_GOAL (NGES0,          1, "nges0",       { r = -((signed_word) v0 >= 0); })
  69. DEF_GOAL (NLTS0,          1, "nlts0",       { r = -((signed_word) v0 < 0); })
  70. DEF_GOAL (NGTS0,          1, "ngts0",       { r = -((signed_word) v0 > 0); })
  71.  
  72. DEF_GOAL (MAXS,           2, "maxs",        { r = (signed_word) v0 > (signed_word) v1 ? v0 : v1; })
  73. DEF_GOAL (MINS,           2, "mins",        { r = (signed_word) v0 < (signed_word) v1 ? v0 : v1; })
  74. DEF_GOAL (MAXU,           2, "maxu",        { r = (unsigned_word) v0 > (unsigned_word) v1 ? v0 : v1; })
  75. DEF_GOAL (MINU,           2, "minu",        { r = (unsigned_word) v0 < (unsigned_word) v1 ? v0 : v1; })
  76. DEF_GOAL (CMPS,           2, "cmps",        { r = (signed_word) v0 > (signed_word) v1? 1 : ((signed_word) v0 < (signed_word) v1 ? -1 : 0); })
  77. DEF_GOAL (CMPU,           2, "cmpu",        { r = (unsigned_word) v0 > (unsigned_word) v1? 1 : ((unsigned_word) v0 < (unsigned_word) v1 ? -1 : 0); })
  78. DEF_GOAL (SGN,            1, "sgn",         { r = (signed_word) v0 > 0 ? 1 : ((signed_word) v0 < 0 ? -1 : 0); })
  79. DEF_GOAL (ABS,            1, "abs",         { r = (signed_word) v0 < 0 ? -v0 : v0; })
  80. DEF_GOAL (NABS,           1, "nabs",        { r = (signed_word) v0 > 0 ? -v0 : v0; })
  81. DEF_GOAL (GRAY,           1, "gray",        { r = ((~(v0 ^ (v0 << 1)) & (1 << 31)) | ((v0 << 1) & ~(1 << 31)) | (v0 >> 31)); })
  82. DEF_GOAL (GRAY2,          1, "gray2",       { v0 = ((~(v0 ^ (v0 << 1)) & (1 << 31)) | ((v0 << 1) & ~(1 << 31)) | (v0 >> 31)); r = ((~(v0 ^ (v0 << 1)) & (1 << 31)) | ((v0 << 1) & ~(1 << 31)) | (v0 >> 31)); })
  83. DEF_GOAL (DIVIDE_BY_2,    1, "divide_by_2", { r = (signed_word) v0 / 2; })
  84. DEF_GOAL (DIVIDE_BY_4,    1, "divide_by_4", { r = (signed_word) v0 / 4; })
  85. DEF_GOAL (DIVIDE_BY_2e30,    1, "divide_by_2e30", { r = (signed_word) v0 / (1<<30); })
  86. DEF_GOAL (DIVIDE_BY_2e31,    1, "divide_by_2e31", { r = (signed_word) v0 / (1<<31); })
  87.  
  88. DEF_GOAL (EQ_PLUS,        3, "eq+",         { r = (v0 == v1) + v2; })
  89. DEF_GOAL (NE_PLUS,        3, "ne+",         { r = (v0 != v1) + v2; })
  90. DEF_GOAL (LES_PLUS,       3, "les+",        { r = ((signed_word) v0 <= (signed_word) v1) + v2; })
  91. DEF_GOAL (GES_PLUS,       3, "ges+",        { r = ((signed_word) v0 >= (signed_word) v1) + v2; })
  92. DEF_GOAL (LTS_PLUS,       3, "lts+",        { r = ((signed_word) v0 < (signed_word) v1) + v2; })
  93. DEF_GOAL (GTS_PLUS,       3, "gts+",        { r = ((signed_word) v0 > (signed_word) v1) + v2; })
  94. DEF_GOAL (LEU_PLUS,       3, "leu+",        { r = ((unsigned_word) v0 <= (unsigned_word) v1) + v2; })
  95. DEF_GOAL (GEU_PLUS,       3, "geu+",        { r = ((unsigned_word) v0 >= (unsigned_word) v1) + v2; })
  96. DEF_GOAL (LTU_PLUS,       3, "ltu+",        { r = ((unsigned_word) v0 < (unsigned_word) v1) + v2; })
  97. DEF_GOAL (GTU_PLUS,       3, "gtu+",        { r = ((unsigned_word) v0 > (unsigned_word) v1) + v2; })
  98. DEF_GOAL (LESU_PLUS,      3, "lesu+",       { r = ((signed_word) v0 < 0 || (unsigned_word) v0 <= (unsigned_word) v1) + v2; })
  99. DEF_GOAL (GESU_PLUS,      3, "gesu+",       { r = ((signed_word) v0 >= 0 && (unsigned_word) v0 >= (unsigned_word) v1) + v2; })
  100. DEF_GOAL (LTSU_PLUS,      3, "ltsu+",       { r = ((signed_word) v0 < 0 || (unsigned_word) v0 < (unsigned_word) v1) + v2; })
  101. DEF_GOAL (GTSU_PLUS,      3, "gtsu+",       { r = ((signed_word) v0 >= 0 && (unsigned_word) v0 > (unsigned_word) v1) + v2; })
  102. DEF_GOAL (EQ0_PLUS,       2, "eq0+",        { r = (v0 == 0) + v1; })
  103. DEF_GOAL (NE0_PLUS,       2, "ne0+",        { r = (v0 != 0) + v1; })
  104. DEF_GOAL (LES0_PLUS,      2, "les0+",       { r = ((signed_word) v0 <= 0) + v1; })
  105. DEF_GOAL (GES0_PLUS,      2, "ges0+",       { r = ((signed_word) v0 >= 0) + v1; })
  106. DEF_GOAL (LTS0_PLUS,      2, "lts0+",       { r = ((signed_word) v0 < 0) + v1; })
  107. DEF_GOAL (GTS0_PLUS,      2, "gts0+",       { r = ((signed_word) v0 > 0) + v1; })
  108.  
  109. DEF_SYNONYM (EQ_PLUS,        "peq")
  110. DEF_SYNONYM (NE_PLUS,        "pne")
  111. DEF_SYNONYM (LES_PLUS,       "ples")
  112. DEF_SYNONYM (GES_PLUS,       "pges")
  113. DEF_SYNONYM (LTS_PLUS,       "plts")
  114. DEF_SYNONYM (GTS_PLUS,       "pgts")
  115. DEF_SYNONYM (LEU_PLUS,       "pleu")
  116. DEF_SYNONYM (GEU_PLUS,       "pgeu")
  117. DEF_SYNONYM (LTU_PLUS,       "pltu")
  118. DEF_SYNONYM (GTU_PLUS,       "pgtu")
  119. DEF_SYNONYM (LESU_PLUS,      "plesu")
  120. DEF_SYNONYM (GESU_PLUS,      "pgesu")
  121. DEF_SYNONYM (LTSU_PLUS,      "pltsu")
  122. DEF_SYNONYM (GTSU_PLUS,      "pgtsu")
  123. DEF_SYNONYM (EQ0_PLUS,       "peq0")
  124. DEF_SYNONYM (NE0_PLUS,       "pne0")
  125. DEF_SYNONYM (LES0_PLUS,      "ples0")
  126. DEF_SYNONYM (GES0_PLUS,      "pges0")
  127. DEF_SYNONYM (LTS0_PLUS,      "plts0")
  128. DEF_SYNONYM (GTS0_PLUS,      "pgts0")
  129.  
  130. DEF_GOAL (EQ_MINUS,       3, "eq-",         { r = v2 - (v0 == v1); })
  131. DEF_GOAL (NE_MINUS,       3, "ne-",         { r = v2 - (v0 != v1); })
  132. DEF_GOAL (LES_MINUS,      3, "les-",        { r = v2 - ((signed_word) v0 <= (signed_word) v1); })
  133. DEF_GOAL (GES_MINUS,      3, "ges-",        { r = v2 - ((signed_word) v0 >= (signed_word) v1); })
  134. DEF_GOAL (LTS_MINUS,      3, "lts-",        { r = v2 - ((signed_word) v0 < (signed_word) v1); })
  135. DEF_GOAL (GTS_MINUS,      3, "gts-",        { r = v2 - ((signed_word) v0 > (signed_word) v1); })
  136. DEF_GOAL (LEU_MINUS,      3, "leu-",        { r = v2 - ((unsigned_word) v0 <= (unsigned_word) v1); })
  137. DEF_GOAL (GEU_MINUS,      3, "geu-",        { r = v2 - ((unsigned_word) v0 >= (unsigned_word) v1); })
  138. DEF_GOAL (LTU_MINUS,      3, "ltu-",        { r = v2 - ((unsigned_word) v0 < (unsigned_word) v1); })
  139. DEF_GOAL (GTU_MINUS,      3, "gtu-",        { r = v2 - ((unsigned_word) v0 > (unsigned_word) v1); })
  140. DEF_GOAL (LESU_MINUS,     3, "lesu-",       { r = v2 - ((signed_word) v0 < 0 || (unsigned_word) v0 <= (unsigned_word) v1); })
  141. DEF_GOAL (GESU_MINUS,     3, "gesu-",       { r = v2 - ((signed_word) v0 >= 0 && (unsigned_word) v0 >= (unsigned_word) v1); })
  142. DEF_GOAL (LTSU_MINUS,     3, "ltsu-",       { r = v2 - ((signed_word) v0 < 0 || (unsigned_word) v0 < (unsigned_word) v1); })
  143. DEF_GOAL (GTSU_MINUS,     3, "gtsu-",       { r = v2 - ((signed_word) v0 >= 0 && (unsigned_word) v0 > (unsigned_word) v1); })
  144.  
  145. DEF_GOAL (EQ0_MINUS,      2, "eq0-",        { r = v1 - (v0 == 0); })
  146. DEF_GOAL (NE0_MINUS,      2, "ne0-",        { r = v1 - (v0 != 0); })
  147. DEF_GOAL (LES0_MINUS,     2, "les0-",       { r = v1 - ((signed_word) v0 <= 0); })
  148. DEF_GOAL (GES0_MINUS,     2, "ges0-",       { r = v1 - ((signed_word) v0 >= 0); })
  149. DEF_GOAL (LTS0_MINUS,     2, "lts0-",       { r = v1 - ((signed_word) v0 < 0); })
  150. DEF_GOAL (GTS0_MINUS,     2, "gts0-",       { r = v1 - ((signed_word) v0 > 0); })
  151.  
  152. DEF_GOAL (NEQ_AND,        3, "naeq",        { r = -(v0 == v1) & v2; })
  153. DEF_GOAL (NNE_AND,        3, "nane",        { r = -(v0 != v1) & v2; })
  154. DEF_GOAL (NLES_AND,       3, "nales",       { r = -((signed_word) v0 <= (signed_word) v1) & v2; })
  155. DEF_GOAL (NGES_AND,       3, "nages",       { r = -((signed_word) v0 >= (signed_word) v1) & v2; })
  156. DEF_GOAL (NLTS_AND,       3, "nalts",       { r = -((signed_word) v0 < (signed_word) v1) & v2; })
  157. DEF_GOAL (NGTS_AND,       3, "nagts",       { r = -((signed_word) v0 > (signed_word) v1) & v2; })
  158. DEF_GOAL (NLEU_AND,       3, "naleu",       { r = -((unsigned_word) v0 <= (unsigned_word) v1) & v2; })
  159. DEF_GOAL (NGEU_AND,       3, "nageu",       { r = -((unsigned_word) v0 >= (unsigned_word) v1) & v2; })
  160. DEF_GOAL (NLTU_AND,       3, "naltu",       { r = -((unsigned_word) v0 < (unsigned_word) v1) & v2; })
  161. DEF_GOAL (NGTU_AND,       3, "nagtu",       { r = -((unsigned_word) v0 > (unsigned_word) v1) & v2; })
  162.  
  163. DEF_GOAL (NEQ0_AND,       2, "naeq0",       { r = -(v0 == 0) & v1; })
  164. DEF_GOAL (NNE0_AND,       2, "nane0",       { r = -(v0 != 0) & v1; })
  165. DEF_GOAL (NLES0_AND,      2, "nales0",      { r = -((signed_word) v0 <= 0) & v1; })
  166. DEF_GOAL (NGES0_AND,      2, "nages0",      { r = -((signed_word) v0 >= 0) & v1; })
  167. DEF_GOAL (NLTS0_AND,      2, "nalts0",      { r = -((signed_word) v0 < 0) & v1; })
  168. DEF_GOAL (NGTS0_AND,      2, "nagts0",      { r = -((signed_word) v0 > 0) & v1; })
  169.  
  170. DEF_GOAL (FFS,            1, "ffs",         { r = ffs (v0); })
  171. DEF_GOAL (MULTADJ,        3, "multadj",     { r = v1 + ((signed_word) v0 < 0 ? v2 : 0); })
  172.  
  173. DEF_GOAL (CMPBYTES,    2, "cmpbytes",
  174.   {
  175.     union { word w; char b[4]; } __r1;
  176.     union { word w; char b[4]; } __r2;
  177.     __r1.w = (v0); __r2.w = (v1);
  178.     r = ((__r1.b[0] != __r2.b[0]) && (__r1.b[1] != __r2.b[1])
  179.      && (__r1.b[2] != __r2.b[2]) && (__r1.b[3] != __r2.b[3]));
  180.   })
  181.  
  182. DEF_GOAL (ZDEPI_FOR_MOVSI, 1, "zfm",
  183.       {
  184.         word __t;
  185.         word __mask;
  186.         __mask = v0 & -v0;
  187.  
  188.         __t = (v0 >> 4) + __mask;
  189.         __t &= ~(__mask - 1);
  190.  
  191.         r = ((__t & (__t - 1)) == 0);
  192.       })
  193.  
  194. #ifdef __GNUC__
  195. #if 0
  196. DEF_GOAL (UDIV_QRNND,     3, "udiv_qrnnd",  ({ word t1, t2; udiv_qrnnd (t1, t2, v0, v1, v2); r = t1; }))
  197. DEF_GOAL (UMOD_QRNND,     3, "umod_qrnnd",  ({ word t1, t2; udiv_qrnnd (t1, t2, v0, v1, v2); r = t2; }))
  198. #endif
  199. DEF_GOAL (UMULH,     2, "umulh",  ({ word t1; word t2; umul_ppmm (t1, t2, v0, v1); r = t1; }))
  200. #endif /* __GNUC__ */
  201.  
  202. #if 0
  203. DEF_GOAL (UDIV,           2, "udiv",        { r = v0 / v1; })
  204. #endif
  205.  
  206. /*
  207. Local variables:
  208. mode:c
  209. version-control: t
  210. End:
  211. */
  212.